package StructuralPattern.ProxyPattern.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyHandler implements InvocationHandler {
    private Object realService;

    public DynamicProxyHandler(Object realService) {

        this.realService = realService;
    }
    /*
    newProxyInstance，方法有三个参数：
        loader: 用哪个类加载器去加载代理对象
        interfaces:动态代理类需要实现的接口
        h:动态代理方法在执行时，会调用h里面的invoke方法去执行
     */
    public Object getRealService(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), realService.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(realService, args);
        // 让service调用方法，方法返回值
        System.out.println(proxy.getClass().getName() + "代理类执行" +realService.getClass().getName()+"内部"+ method.getName() + "方法，返回" + result +  "，记录日志！");
        return result;
    }
}
